import numpy as np

"""
全量梯度下降
"""
#创建数据集
np.random.seed(30)
X = np.random.rand(100,1) # 创建100个服从均匀分布的x样本，X为nx1的列向量
Y = 4 + 3*X + np.random.randn(100,1)
X_b = np.c_[np.ones((100,1)),X]

# 创建超参数
#learning_rate = 0.001
n_iterations = 10000

t0,t1 = 5, 500


# 定义一个函数来调整学习率
def learning_rate_schedule(t):
    return t0/(t+t1)

# 1.初始化theta， w0,w1,...,wn。根据标准正太分布创建W
theta = np.random.randn(2,1) #创建两行一列的列向量θ， hθ（X）=Xθ

# 4.判断是否收敛，一般不会去设置阈值，而是采用设置相对大的迭代次数保证可以收敛
for i in range(n_iterations):

    # 2.求解cost梯度
    gradient = X_b.T.dot(X_b.dot(theta)-Y)
    """
    单步计算梯度
    gradient = X_b.T.dot(X_b.dot(theta)-Y)  # gradient为2x1的列向量
    print(f"gradient0:{gradient}")
    """
    # 3.应用梯度下降法的公式去调整θ值θt+1=θt-α*gradient
    learning_rate = learning_rate_schedule(i)
    theta = theta-learning_rate*gradient

print(f"theta:{theta}")






